#include<bits/stdc++.h>
using namespace std;
struct car{
    long long d,v,a;
}c[100005];
long long p[100005];
struct len{
    long long lfz,lfm;
    bool ifleft;
    long long rfz,rfm;
    bool ifright;
    long long num;
}b[100005];
struct pd{
    long long l, r, sze;
}f[100005];
long long gcd(long long n,long long m){
    if(m==0) return n;
    return gcd(m,n%m);
}
long long fc[100005];
long long y[100005];
bool cmp(pd a,pd b){
    return a.sze<b.sze;
}
bool h2[100005];
long long cmpf(long long fz1,long long fm1,long long fz2,long long fm2){
    long long lcm=fm1*fm2/gcd(fm1,fm2);
    fz1*=(lcm/fm1);
    fz2*=(lcm/fm2);
    if(fz1>fz2) return 1;
    if(fz1<fz2) return 2;
    return 0;
}
int tmp[30];
long long n,m,l,v;
int zx=INT_MAX;
void dfs(int dep){
    if(dep>m){
        int F=1;
        int cnt=0;
        for(int i=1;i<=m;i++){
            if(tmp[i]) cnt++;
        }
        for(int i=1;i<=n;i++){
            int flag=0;
            for(int j=1;j<=m;j++){
                if(tmp[j]==0) continue;
                if(f[i].r>=j&&f[i].l<=j) {
                    flag=1;
                    break;
                }
            }
            if(flag==0) {
                F=0;
                break;
            }
        }
        if(F) zx=min(zx,cnt);
        return;
    }
    tmp[dep]=1;
    dfs(dep+1);
    tmp[dep]=0;
    dfs(dep+1);
}
void work(){
    memset(h2,0,sizeof(h2));

    cin>>n>>m>>l>>v;
    for(long long i=1;i<=n;i++) cin>>c[i].d>>c[i].v>>c[i].a;
    for(long long i=1;i<=m;i++) cin>>p[i];
    long long top=0;
    for(long long i=1;i<=n;i++){
        if(c[i].a<0){
            if(c[i].v>v){
                long long fz=c[i].v*c[i].v-v*v+(-2*c[i].a)*c[i].d,fm=-2*c[i].a;
                bool flag;
                if(fz>l*fm) flag=1,fz=l*fm;
                else flag=0;
                long long gtmp=gcd(fz,fm);
                fz/=gtmp,fm/=gtmp;
                ++top;
                b[top].lfz=c[i].d,b[top].lfm=1,b[top].rfz=fz,b[top].rfm=fm;
                b[top].ifleft=1,b[top].ifright=flag;

                b[top].num=i;
            }
        }
        else{
            if(c[i].a==0){
                if(c[i].v>v){
                    ++top;
                    b[top].lfz=c[i].d,b[top].lfm=1,b[top].rfz=l,b[top].rfm=1;
                    b[top].ifleft=1,b[top].ifright=1;

                    b[top].num=i;
                }
            }
            else{
                if(c[i].v>v){
                    ++top;
                    b[top].lfz=c[i].d,b[top].lfm=1,b[top].rfz=l,b[top].rfm=1;
                    b[top].ifleft=1,b[top].ifright=1;

                    b[top].num=i;
                }
                else{
                    if(c[i].v==v){
                        ++top;
                        b[top].lfz=c[i].d,b[top].lfm=1,b[top].rfz=l,b[top].rfm=1;
                        b[top].ifleft=0,b[top].ifright=1;

                        b[top].num=i;
                    }
                    else{
                        long long fz=v*v-c[i].v*c[i].v+(2*c[i].a)*c[i].d,fm=2*c[i].a;
                        if(fz>=fm*l) {
                            continue;
                        }
                        long long gtmp=gcd(fz,fm);
                        fz/=gtmp,fm/=gtmp;
                        ++top;
                        b[top].lfz=fz,b[top].lfm=fm,b[top].ifleft=0;
                        b[top].rfz=l,b[top].rfm=1,b[top].ifright=1;

                        b[top].num=i;
                    }
                }
            }
        }
    }
    long long top1=0;
    for(long long i=1;i<=top;i++){
        long long der;
        if(!b[i].ifleft){
            long long l=0,r=m+1;
            while(l+1<r){
                long long mid=(l+r)>>1;
                if(cmpf(b[i].lfz,b[i].lfm,p[mid],1)==2){
                    r=mid;
                }
                else l=mid;
            }
            der=r;
        }
        if(b[i].ifleft){
            long long l=0,r=m+1;
            while(l+1<r){
                long long mid=(l+r)>>1;
                if(cmpf(b[i].lfz,b[i].lfm,p[mid],1)==0||cmpf(b[i].lfz,b[i].lfm,p[mid],1)==2){
                    r=mid;
                }
                else l=mid;
            }
            der=r;
        }
        long long del;
        if(!b[i].ifright){
            long long l=0,r=m+1;
            while(l+1<r){
                long long mid=(l+r)>>1;
                if(cmpf(b[i].rfz,b[i].rfm,p[mid],1)==1){
                    l=mid;
                }
                else r=mid;
            }
            del=l;
        }
        if(b[i].ifright){
            long long l=0,r=m+1;
            while(l+1<r){
                long long mid=(l+r)>>1;
                if(cmpf(b[i].rfz,b[i].rfm,p[mid],1)==1||cmpf(b[i].rfz,b[i].rfm,p[mid],1)==0){
                    l=mid;
                }
                else r=mid;
            }
            del=l;
        }
        if(del>=der){
            f[++top1].l=der,f[top1].r=del,f[top1].sze=del-der+1;
        }
    }
    cout<<top1<<' ';
   zx=INT_MAX;
    dfs(1);
    cout<<m-zx<<endl;
    return;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    long long T;
    cin>>T;
    while(T--) work();
    return 0;
}
